package net.qiqbframework.messaging;

import net.qiqbframework.serialization.SerializedObject;
import net.qiqbframework.serialization.Serializer;

import javax.annotation.Nonnull;
import java.io.Serializable;
import java.util.Map;

/**
 * 消息的表示形式，包含有效负载和元数据。消息的典型示例是命令、事件
 */
public interface Message<T> extends Serializable {


    /**
     * 每次都消息产生，都会创建一个唯一标识
     *
     * @return 唯一标识
     */
    String getIdentifier();

    /**
     * 元数据
     */
    MetaData getMetaData();

    /**
     * 消息的具体数据信息
     *
     * @return 消息的具体数据信息
     */
    T getPayload();

    /**
     * 消息的具体数据信息类型
     */
    Class<T> getPayloadType();


    void withMetaData(@Nonnull Map<String, ?> metaData);


    void andMetaData(@Nonnull Map<String, ?> metaData);


    default <R> SerializedObject<R> serializePayload(Serializer serializer, Class<R> expectedRepresentation) {
        return serializer.serialize(getPayload(), expectedRepresentation);
    }

    default <R> SerializedObject<R> serializeMetaData(Serializer serializer, Class<R> expectedRepresentation) {
        return serializer.serialize(getMetaData(), expectedRepresentation);
    }

}

